#!/usr/bin/env python3
import sys
import json
from scapy.all import (
    FieldLenField,
    IntField,
    IPOption,
    Packet,
    PacketListField,
    ShortField,
    get_if_list,
    sniff
)
from scapy.layers.inet import _IPOption_HDR

def get_if():
    ifs = get_if_list()
    iface = None
    for i in get_if_list():
        if "eth0" in i:
            iface = i
            break
    if not iface:
        print("Cannot find eth0 interface")
        exit(1)
    return iface

class SwitchTrace(Packet):
    fields_desc = [IntField("swid", 0),
                   IntField("qdepth", 0)]
    def extract_padding(self, p):
        return "", p

class IPOption_MRI(IPOption):
    name = "MRI"
    option = 31
    fields_desc = [_IPOption_HDR,
                   FieldLenField("length", None, fmt="B",
                                 length_of="swtraces",
                                 adjust=lambda pkt, l: l * 2 + 4),
                   ShortField("count", 0),
                   PacketListField("swtraces",
                                   [],
                                   SwitchTrace,
                                   count_from=lambda pkt: (pkt.count * 1))]



def handle_pkt(pkt, file):
    output = "got a packet\n" + pkt.show2(dump=True)
    print(output)
    with open("/home/p4/share_dir/test.json", 'rb') as f:# 使用只读模型，并定义名称为f
        params = json.load(f)  # 加载json文件
        params["1"]["Info"] = output
        params["2"]["Info"] = output
        params["3"]["Info"] = output
        params["4"]["Info"] = output
        params["5"]["Info"] = output
        params["6"]["Info"] = output
        params["7"]["Info"] = output
        params["8"]["Info"] = output
        params["9"]["Info"] = output
        params["10"]["Info"] = output
        params["11"]["Info"] = output
        params["12"]["Info"] = output
    with open("/home/p4/share_dir/test.json", 'w') as r:
        # 将dict写入名称为r的文件中
        json.dump(params, r)
    file.write(output + "\n")
    sys.stdout.flush()


def main():
    iface = 'eth0'
    print("sniffing on %s" % iface)
    sys.stdout.flush()
    with open("packet_capture.txt", "w") as file:  # Open a file in write mode
        sniff(filter="udp and port 4321", iface=iface,
              prn=lambda x: handle_pkt(x, file))  # Pass the file as a second argument to handle_pkt

if __name__ == '__main__':
    main()
